# @Time : 2020/7/22 15:44
# @Author : Fioman 
# @Phone : 13149920693
"""
双边滤波是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效地保护图像内的边缘信息.
1> 基本原理:
前述滤波方式基本都只考虑了空间的权重信息,这种情况计算起来比较方便,但是在边缘信息的处理上存在较大的问题.
无论是高斯滤波,均值滤波,还是平均滤波,都会计算边缘上的各个像素点的加权平均值,从而模糊边缘信息.

双边滤波在计算某一个像素点的新值的时候,不仅考虑距离信息(距离越远,权重越小),还考虑色彩信息(色彩差别越大,权重越小)
双边滤波综合考虑距离和色彩的权重结果,既能够有效地去除噪声,又能较好地保存边缘信息.
在双边滤波中,当处在边缘时,与当前点色彩相近的像素点(颜色距离很近)会被给予较大的权重值;而与当前色彩差别较大的像素点
(颜色距离很远)会被给予较小的权重值(极端情况下权重可能是0,直接忽略掉该点).这样就保护了边缘信息.
cv.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)
d是在滤波时选取的空间距离参数,这里表示以当前像素点位中心点的直径.如果该值非正数,则会自动从参数sigmaSpace计算得到.
如果滤波空间较大(d>5),则速度较慢.因此,实际使用的时候,推荐d = 5.如果对于噪声较大的离线滤波,可以选择d = 9
sigmaColor是滤波处理的时候选取的颜色差值范围,该值决定了周围哪些像素点能被参与到滤波中来.
与当前像素点的像素值差值小于sigmaColor的像素点,能够参与到当前的滤波中.该值越大,就说明周围有越多的像素点可以参与到运算中.
该值为0的时候,滤波失去了意义,当值为255的时候,指定直径内的所有点都能参与运算.
sigmaSpace是坐标空间中的sigma值.它的值越大,说明有越多的点能够参与到滤波计算中来.
当d > 0的时候,无论sigmaSpace的值如何,d都指定邻域大小;否则,d与sigmaSpace的值成正比.
为了简单起见,可以将两个sigma(sigmaColor 和 sigmaSpace)值设置为相同的,如果它们的值比较小(小于10)
滤波的效果将不太明显,如果它们的值较大,(例如大于150),则滤波的效果会比较明显,将会产生卡通的效果.
"""

import cv2 as cv
import numpy as np
from 第二周_opencv轻松入门.第06章_图像平滑处理.image_show_tools import image_show

img = cv.imread("test.bmp",cv.IMREAD_GRAYSCALE)
# 当d指定的时候,sigmaSpace的值无论指定位多少,都会以d指定的为准.
blurred = cv.bilateralFilter(img,5,20,0)
image_show("Original",img)
image_show("blurred",blurred)












